home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / Modules / LocalFast.ASM < prev    next >
Assembly Source File  |  2000-09-04  |  7KB  |  293 lines

  1. ; FILE: Source:modules/LocalFast.ASM          REV: 4 --- LocalFast module
  2.  
  3. ;
  4. ; LocalFast module for BlizKick 1.20+
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ; Written by Harry "Piru" Sintonen.
  7. ; This source code is Public Domain.
  8. ;
  9. ; As I decided to drop LOCALFAST feature from BlizKick 1.20
  10. ; and after getting some requests about getting this feature
  11. ; back (hi Hexaae;), I decided to code it as a external
  12. ; module.
  13. ;
  14. ; Imlementation note: this module WILL be confused by PoolMem.
  15. ; Doesn't crash, but will refuse to install.
  16. ;
  17. ; V1.2 - 24th Feb 2000
  18. ; Fixed stupid bug: it didn't sub 512k from memory size even when
  19. ; it was needed. This kindof made this module unusable until now.
  20. ; sorry :)
  21. ;
  22. ; V1.3 - 5th Aug 2000
  23. ; Fixed really stupid bug: the memory node name was referencing
  24. ; wrong memory (the mem used when loading the module!). Fixed with
  25. ; simple memname pc-relativity inside the module patch code.
  26. ; Special thanks to Hexaae, now the bug is finally fixed.. :-)
  27. ; LocalFast also fucked up if the LocalFast patch was installed
  28. ; inside ROM. Fixed that too.
  29. ;
  30. ;    - Piru
  31. ;
  32.  
  33.     incdir    "include:"
  34.     include    "exec/types.i"
  35.     include    "exec/memory.i"
  36.     include    "exec/execbase.i"
  37.  
  38.     include    "blizkickmodule.i"
  39.  
  40. ; PoolMem uses this to indicate small pool MemHeader.
  41.     BITDEF    MEM,POOLMEM,4
  42.  
  43.  
  44.     SECTION    PATCH,CODE
  45. _DUMMY_LABEL
  46.     BK_PTC
  47.  
  48. ; Code is run with following incoming parameters:
  49. ;
  50. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  51. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  52. ; d0=ROM lenght in bytes    eg. $00080000
  53. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  54. ;    CALL: jsr (a2)
  55. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  56. ;     OUT: d0=ptr to resident (buf) or NULL
  57. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  58. ;    CALL: jsr (a3)
  59. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  60. ;     OUT: d0=success
  61. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  62. ;    CALL: jsr (a4)
  63. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  64. ;     OUT: -
  65. ; d6=dosbase, a6=execbase
  66. ;
  67. ; Code should return:
  68. ;
  69. ; d0=true if succeeded, false if failed.
  70. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  71.  
  72.     moveq    #0,d7
  73.  
  74.     cmp.w    #37,($C,a0)        ;requires V37+ rom image
  75.     blo    .exit
  76.  
  77.     lea    (regs,pc),a5
  78.     movem.l    d0/a0-a4,(a5)
  79.  
  80.     ; find the blizzard memory header
  81.  
  82.     jsr    (-$84,a6)        ; Forbid
  83.     lea    (MemList,a6),a5
  84.     lea    (LH_TAIL,a5),a4        ; end marker
  85. .scanloop    move.l    (a5),a5
  86.     cmp.l    a5,a4            ; list end reached?
  87.     beq    .nomem
  88.  
  89.     move.w    (MH_ATTRIBUTES,a5),d0
  90.  
  91.     ; this is a 1st PoolMem check...
  92.     btst    #MEMB_POOLMEM,d0
  93.     bne    .poolmem
  94.  
  95.     ; Find public fast, that has no MEMF_POOLMEM, MEMF_CHIP,
  96.     ; MEMF_KICK or MEMF_LOCAL set:
  97.     and.w    #MEMF_POOLMEM!MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC!MEMF_KICK!MEMF_LOCAL,d0
  98.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  99.     bne.b    .scanloop
  100.  
  101.     cmp.l    #$01000000,(MH_LOWER,a5) ; must be 32bit mem
  102.     blo.b    .scanloop
  103.  
  104. ;;    move.l    (LN_NAME,a5),d0        ; some logic to check node name
  105. ;;    beq.b    .found
  106. ;;    move.l    d0,a2
  107. ;;    move.l    (a2),d0
  108. ;;    or.l    #$20202020,d0        ; To lowercase
  109. ;;    cmp.l    #'bliz',d0
  110. ;;    beq.b    .found
  111. ;;    tst.b    (a2)            ; null name -> buggy AllocMem result test!
  112. ;;    bne.b    .scanloop
  113. ;;.found
  114.     move.l    (MH_UPPER,a5),d1
  115.  
  116.     move.l    #$07FFFF,d0        ; this is a 2nd PoolMem check...
  117.     and.l    d1,d0
  118.     bne    .poolmem
  119.  
  120.     move.l    #$80000,d0        ; is upper at 512k boundary?
  121.     and.l    d1,d0
  122.     bne.b    .is_ok            ; yup! it's already ok then!
  123.     sub.l    #$80000,d1        ; nope. snip off last 512k!
  124. .is_ok
  125.  
  126.     move.l    (MH_LOWER,a5),d0
  127.     clr.w    d0            ; mask out MH stuff
  128.     lea    (aml_regs,pc),a0
  129.     sub.l    d0,d1            ; d1=mem size
  130.  
  131.     move.l    d1,(a0)+        ; size
  132.  
  133.     move.w    (MH_ATTRIBUTES,a5),d1
  134.     and.l    #MEMF_PUBLIC!MEMF_FAST!MEMF_LOCAL!MEMF_24BITDMA,d1
  135.     move.l    d1,(a0)+        ; attrs
  136.  
  137.     move.b    (LN_PRI,a5),d1
  138.     extb.l    d1            ; sign extend b -> l
  139.     move.l    d1,(a0)+        ; pri
  140.  
  141.     move.l    d0,(a0)+        ; base
  142.  
  143.     move.l    (LN_NAME,a5),d0
  144.     beq.b    .lmpfixname
  145.     move.l    d0,a1
  146.     tst.b    (a1)
  147.     bne.b    .lmphasname
  148. .lmpfixname
  149.     lea    (.fixedname,pc),a1
  150. .lmphasname
  151.     moveq    #32-2,d0
  152. .lmpcopy    move.b    (a1)+,(a0)+
  153.     dbeq    d0,.lmpcopy
  154.     beq.b    .lmpnoname
  155.     clr.b    (a0)+
  156. .lmpnoname
  157.     jsr    (-$8a,a6)        ; Permit
  158.  
  159.     ; find exec.library resident tag
  160.  
  161.     lea    (.execname,pc),a1
  162.     movem.l    (regs,pc),d0/a0
  163.     move.l    (findresident,pc),a2
  164.     jsr    (a2)
  165.     tst.l    d0
  166.     beq    .exit
  167.  
  168.     move.l    d0,a3
  169.     move.l    (RT_INIT,a3),d1
  170.  
  171.     ;test if inside rom bounds?
  172.     move.l    (rom_log,pc),d0
  173.     cmp.l    d0,d1
  174.     blo.b    .nofix
  175.     add.l    (rom_size,pc),d0
  176.     cmp.l    d0,d1
  177.     bhs.b    .nofix
  178.     ; inside rom, so generate ram buffer address
  179.     sub.l    (rom_log,pc),d1        ; -$f80000
  180.     add.l    (rom_phys,pc),d1    ; +buffer
  181. .nofix
  182.     ; d1 = RT_INIT address
  183.     ; fix our code to jump here when done
  184.  
  185.     lea    (jumpaddr,pc),a1
  186.     move.l    d1,(a1)
  187.  
  188.     ; install patch code...
  189.  
  190.     lea    (_localfast_module,pc),a1
  191.     movem.l    (regs,pc),d0/a0
  192.     move.l    (installmodule,pc),a2
  193.     jsr    (a2)
  194.     tst.l    d0
  195.     beq.b    .exit
  196.  
  197.     ; find ourself
  198.  
  199.     lea    (_name,pc),a1
  200.     movem.l    (regs,pc),d0/a0
  201.     move.l    (findresident,pc),a2
  202.     jsr    (a2)
  203.     tst.l    d0
  204.     beq.b    .exit
  205.  
  206.     ; fix the exec RT_INIT pointer to jump
  207.     ; our patch code...
  208.  
  209.     move.l    d0,a0
  210.     ; (RT_INIT,a0) gives us pointer to RT_INIT as logical address
  211.     moveq    #_earlycode-_init,d0
  212.     add.l    (RT_INIT,a0),d0
  213.     move.l    d0,(RT_INIT,a3)
  214.  
  215.     ; all done, return success
  216.  
  217.     moveq    #1,d7
  218. .exit
  219.     move.l    d7,d0
  220.     rts
  221.  
  222. .nomem    lea    (.nomemerr,pc),a0
  223.  
  224. .perr    jsr    (-$8a,a6)        ; Permit
  225.     move.l    (printf,pc),a2
  226.     jsr    (a2)
  227.     bra.b    .exit
  228.  
  229. .poolmem    lea    (.poolmemerr,pc),a0
  230.     bra.b    .perr
  231.  
  232. .execname    dc.b    'exec.library',0
  233. .nomemerr    dc.b    'LocalFast: suitable memory header not found!',10,0
  234. .poolmemerr    dc.b    'LocalFast: PoolMem has messed up Memory headers!',10,0
  235. .fixedname    dc.b    'Blizzard_Mem',0
  236.  
  237.  
  238.     CNOP    0,2
  239. _localfast_module
  240.  BK_MOD BKMF_SingleMode,_end,(0)<<24+37<<16+NT_UNKNOWN<<8+(256-128),_name,_idstr,_init
  241.  
  242. ; Singlemode on,
  243. ; NEVER INIT module, requires KS V37.x or better, module type NT_UNKNOWN, priority -128.
  244.  
  245. _init    rts
  246.  
  247. _earlycode    ; a6=execbase
  248.     movem.l    d0-d2/a0-a1,-(sp)
  249.  
  250.     ; is this memory already present?
  251.     move.l    (aml_base,pc),a1
  252.     lea    (256,a1),a1        ; skip possible MH
  253.     jsr    (-$216,a6)        ; TypeOfMem
  254.     tst.l    d0
  255.     bne.b    .already        ; it is, skip!
  256.  
  257.     ; add the memory!
  258.     movem.l    (aml_regs,pc),d0-d2/a0
  259.     lea    (memname,pc),a1
  260.     jsr    (-$26a,a6)        ; AddMemList
  261. .already
  262.     movem.l    (sp)+,d0-d2/a0-a1
  263.     dc.w    $4ef9
  264. jumpaddr    dc.l    $badc0de
  265.  
  266. aml_regs    dc.l    0            ; d0 size
  267.     dc.l    0            ; d1 attrs
  268.     dc.l    0            ; d2 pri
  269. aml_base    dc.l    0            ; a0 base
  270. memname    ds.b    32            ; space for memory name
  271.  
  272. _name
  273. _idstr    dc.b    'LocalFast.patch',0
  274.     CNOP    0,2
  275. _end
  276.  
  277.  
  278.     CNOP    0,2
  279. regs
  280. rom_size    ds.l    1
  281. rom_phys    ds.l    1
  282. rom_log    ds.l    1
  283. findresident    ds.l    1
  284. installmodule    ds.l    1
  285. printf    ds.l    1
  286.  
  287.  
  288.  
  289.     SECTION    VERSION,DATA
  290.  
  291.     dc.b    '$VER: LocalFast_PATCH 1.3 (5.8.00)',0
  292.  
  293.